home *** CD-ROM | disk | FTP | other *** search
- ┌──────────────────────────────────────────────────────────────────────────┐
- │┌────────────────────────────────────────────────────────────────────────┐│
- ││ ││
- ││ QuickBasic'de karƒìlaƒtìºìm sorunlarì nasìl aƒtìm? ││
- ││ ││
- ││ Minik bazì sorunlar ││
- │└────────────────────────────────────────────────────────────────────────┘│
- │ PS 31 · ₧ubat'96 Gürol Demir │
- └──────────────────────────────────────────────────────────────────────────┘
-
- Bu ay basic dilinde minik bazì sorunlarìn halli üzerinde duralìm.
-
- Konumuz alt baƒlìklarì ƒöyle:
-
- a) Sìralama algoritmasì
- b) Türkçe heceleme
- c) Binary dosya yapìsì
- d) Hscplayer'in basic'e monte edilmesi
-
- ┌────────────────────────┐
- ─────────┤ Sìralama algoritmasì │
- └────────────────────────┘
-
- Sanìrìm yaptìºìnìz programlarda zaman zaman verilerinizi sìraya
- sokma ihtiyacì duydunuz. Bunun için kliƒeleƒmiƒ bir yöntem vardìr. Klasik
- olan bu yöntemin algoritmasì ƒöyledir.
-
- (Amaç verilerin büyükten küçüºe doºru sìralanmasì)
- 1 - Sayac1'i sìfìrla
- 2 - Sayac1'i bir arttìr
- 3 - Sayac1 toplam veri adedini geçti mi?
- a) Evet : programì bitir.(10'na git)
- b) Hayìr: devam et
- 4 - Sayac1 ile tanìmlanan veriyi al
- 5 - Sayac2'yi sìfìrla
- 6 - Sayac2'yi bir arttìr
- 7 - Sayac1 toplam veri adedini geçti mi?
- a) Evet : 2'ye git
- b) Hayìr: devam et
- 8 - Sayac2 ile tanìmlanan veriyi al
- 9 - Sayac1 ve Sayac2 ile ƒaretlenen iki veriyi kìyasla
- a) Eƒit : 6'ya git
- b) Sayac1 ile ƒaretli veri daha büyük : 6'ya git
- c) Sayac2 ile ƒaretli veri daha büyük : Verileri deºiƒtir ve 6'ya git
- 10 - Bitiƒ
-
- (Amaç verilerin küçükten büyüºe doºru sìralanmasì)
- 1 - Sayac1'i sìfìrla
- 2 - Sayac1'i bir arttìr
- 3 - Sayac1 toplam veri adedini geçti mi?
- a) Evet : programì bitir.(10'na git)
- b) Hayìr: devam et
- 4 - Sayac1 ile tanìmlanan veriyi al
- 5 - Sayac2'yi sìfìrla
- 6 - Sayac2'yi bir arttìr
- 7 - Sayac1 toplam veri adedini geçti mi?
- a) Evet : 2'ye git
- b) Hayìr: devam et
- 8 - Sayac2 ile tanìmlanan veriyi al
- 9 - Sayac1 ve Sayac2 ile ƒaretlenen iki veriyi kìyasla
- a) Eƒit : 6'ya git
- b) Sayac1 ile ƒaretli veri daha küçük : 6'ya git
- c) Sayac2 ile ƒaretli veri daha küçük : Verileri deºiƒtir ve 6'ya git
- 10 - Bitiƒ
-
-
- Rakamsal verilerde ve standart metin dosyalarìnda geçerli bu yöntem
- türkçe karakter bulunan stringlerde iƒe yaramaz. Örneºin "Ç" harfi bu usulde
- "Z" den sonra gelir.
-
- Aƒaºìda verilen modül ise Türkçe verileri düzgün bir sìraya sokar.
-
- ┌───────────────────────────────────────────────────────────────────┐
- │ 'Bu program türke karakterlerin yer aldìºì stringleri sìralar │
- │ │
- │'============================= Tanìmlar ========================== │
- │ Enson = 5 'Toplam veri sayìsì │
- │ Nerden = 1 'Kaçìncì karakter baz alìnacak │
- │ Uzunluk = 50 'En uzun verinin boyu │
- │ Tercih = 1 'Küçükten büyüºe ters sìralama │
- │ '1 den farklì ise düz sìralama yapar │
- │ │
- │ REDIM Veri$(Enson) │
- │ │
- │ Veri$(1) = "Çamlìbel" │
- │ Veri$(2) = "Ceyhan" │
- │ Veri$(3) = "çalìƒma" │
- │ Veri$(4) = "çalìƒdì" │
- │ Veri$(5) = "deneme" │
- │'======================= Sìralama programì ====================== │
- │ CLS : PRINT "Sìralama yapìyorum" │
- │ FOR I = 1 TO Enson: FOR Y = 1 TO Enson: FOR z = Nerden TO Uzunluk │
- │ Veri$(Y) = LEFT$(Veri$(Y) + SPACE$(Uzunluk), Uzunluk) │
- │ Veri$(I) = LEFT$(Veri$(I) + SPACE$(Uzunluk), Uzunluk) │
- │ B = ASC(MID$(Veri$(Y), z, 1)): C = ASC(MID$(Veri$(I), z, 1)) │
- │ IF B <> C THEN │
- │ SELECT CASE CHR$(B) │
- │ CASE "ç", "Ç": B = 67.5 │
- │ CASE "º", "ª": B = 71.5 │
- │ CASE "i", "ÿ": B = 73.5 │
- │ CASE "ö", "Ö": B = 79.5 │
- │ CASE "ƒ", "₧": B = 83.5 │
- │ CASE "ü", "Ü": B = 85.5 │
- │ CASE "I": B = 73 │
- │ CASE ELSE: B = (223 AND B) │
- │ END SELECT │
- │ SELECT CASE CHR$(C) │
- │ CASE "ç", "Ç": C = 67.5 │
- │ CASE "º", "ª": C = 71.5 │
- │ CASE "i", "ÿ": C = 73.5 │
- │ CASE "ö", "Ö": C = 79.5 │
- │ CASE "ƒ", "₧": C = 83.5 │
- │ CASE "ü", "Ü": C = 85.5 │
- │ CASE "I": C = 73 │
- │ CASE ELSE: C = (223 AND C) │
- │ END SELECT │
- │ SELECT CASE B │
- │ CASE C │
- │ CASE ELSE │
- │ SELECT CASE Tercih │
- │ CASE 1 │
- │ IF B < C THEN SWAP Veri$(I), Veri$(Y) │
- │ CASE ELSE │
- │ IF B > C THEN SWAP Veri$(I), Veri$(Y) │
- │ END SELECT │
- │ EXIT FOR │
- │ END SELECT │
- │ END IF │
- │ NEXT: NEXT: NEXT │
- │'==========================Ekrana döküm ===========================│
- │ CLS : FOR I = 1 TO Enson: PRINT Veri$(I): NEXT │
- │ │
- └───────────────────────────────────────────────────────────────────┘
-
- ┌────────────────────────┐
- ─────────┤ Heceleme algoritmasì │
- └────────────────────────┘
-
- Kelime iƒlemci programlamaya soyunan kiƒiler için bilinmesi
- gereken algoritmalardan birisi de türkçe heceleme algoritmasìdìr. Türkçe
- heceleme yapmak için uzun uzun dil bilgisi kurallarìnì bilmek gerekmez.
- Sadece sesli harfleri tanìmak yeterlidir. Sesli harfler herkesin bildiºi
- gibi "aeìioöuü" dìr.
-
- Temel mantìk ƒudur. Bir kelimede ilk sesli harf bulunur, sonra
- ikinci sesli harf bulunur. Bunlarìn bulunduºu yer arasìnda ki mesafe heceyi
- belirler. ₧öyleki;
-
- a) Hiç sesli harf yok : Kelimenin tamamì tek hecedir
- b) Tek sesli harf var : Kelimenin tamamì tek hecedir
- c) ÿki sesli harfin yerleri arasìnda tek karakterlik mesafe var:
- ilk hece= Kelimenin baƒì ile ilk seslinin bulunduºu yer
- d) ÿki sesli harfin yerleri arasìnda çok mesafe var:
- ilk hece= Kelimenin baƒì ile ilk seslinin bulunduºu yerin
- bir fazlasì
-
-
- Aƒaºìdaki program bu konuda bir örnektir.
- ┌────────────────────────────────────────────────────────────────────────┐
- │ Sesli$ = "AaEeÿiIìÖöOoÜüUu" │
- │ Kelime$ = "Çekoslavakyalìlaƒtìrìmadìklarìmìzdanmìsìnìz?" │
- │ │
- │ CLS │
- │ DO │
- │ GOSUB Hece │
- │ Kelime$ = RIGHT$(Kelime$, LEN(Kelime$) - LEN(Hece$)) │
- │ IF LEN(Kelime$) = 0 THEN │
- │ PRINT Hece$ │
- │ EXIT DO │
- │ END IF │
- │ PRINT Hece$; "-"; │
- │ LOOP │
- │ END │
- │ │
- │ │
- │ Hece: │
- │ Yer1 = 0 'Birinci sesli harfin yeri │
- │ Yer2 = 0 'ÿkinci " " " │
- │ │
- │ FOR I = 1 TO LEN(Kelime$) │
- │ │
- │ IF Yer1 = 0 THEN │
- │ IF INSTR(Sesli$, MID$(Kelime$, I, 1)) > 0 THEN Yer1 = I │
- │ ELSE │
- │ │
- │ IF Yer2 = 0 THEN │
- │ IF INSTR(Yer1, Sesli$, MID$(Kelime$, I, 1)) > 0 THEN Yer2 = I │
- │ END IF │
- │ END IF │
- │ NEXT │
- │ │
- │ │
- │ IF Yer1 > 0 AND Yer2 > 0 THEN │
- │ IF Yer2 - Yer1 > 2 THEN Ara = Yer1 + 1 ELSE Ara = Yer1 │
- │ Hece$ = LEFT$(Kelime$, Ara) │
- │ ELSE │
- │ IF Yer1 = 0 THEN Hece$ = Kelime$ 'Sesli harf yok │
- │ IF Yer2 = 0 THEN Hece$ = Kelime$ 'Tek sesli harf var │
- │ END IF │
- │ RETURN │
- └────────────────────────────────────────────────────────────────────────┘
-
- ┌────────────────────────┐
- ─────────┤ Binary dosya yapìsì │
- └────────────────────────┘
-
- Çoºu programcì için bir dosyanìn herhangi bir yerinden istenilen
- uzunlukta veri okunmasì veya yazìlmasì bir sorundur. Uygulamada gördüºüm bazì
- gereksiz program satìrlarì binary dosya yapìsìnì anlatmama neden olmuƒtur.
-
- Diyelim ki bir data dosyanìz var. Bu dosyanìn 1243 ncü konumundan
- 37 byte okumak, 2587 nci konumuna 3 byte yazmak silmek istiyorsunuz.
-
- Dosyayì sìralì okuma, sìralì yazma, rastgele okuma yazma gibi
- türlerde açarsanìz bu iƒlemleri kolay yapamazsìnìz. Oysa binary açarsanìz
- bu iƒler çok kolay örnekleyelim.
-
- OPEN "DENE.DAT" FOR BINARY AS 1 'Dosya açìldì
- A$= SPACE$(37): GET 1, 1243, A$ '1243'den 37 byte okundu
- A$= "123": PUT 1, 2587, A$ '2587'ye 3 byte yazìldì
-
- Binary dosya yapìsìnìn kolaylìklarì bununla bitmiyor. Örneºin
- bir dosyadaki rakamsal veri eºer tek byte sìºmìyorsa yapìlan klasik iƒlem
- ƒöyleydi (deºer= birinci byte deºeri*256 + ikinci byte deºeri) oysa binary
- yapìda bu iƒ (GET 1,,Deger%) komutu ile kendiºilinden yapìlìyor.
-
- Son olarak binary yapì ile database programlarìn dosya hìzlarìna
- basic dili ile ulaƒìlabildiºini belirtteyim. ÿlgilenen olursa bu konuya
- tekrar döneriz. Bu sayìda bir dosyanìn istenilen yerinden istenilen byte
- uzunlukta bir kìsmì silerek dosyayì tekrar aynì isimle size geri veren bir
- program modülü de veriyoruz.
-
- ┌──────────────────────────────────────┐
- ─────────┤ Hscplayer'in basic'e monte edilmesi │
- └──────────────────────────────────────┘
-
- Adlib uyumlu ses kartlarìnda çalìƒmak üzere tasarlanmìƒ bir
- sürücü var. Bu sürücü (.hsc) modunda yazìlmìƒ ses dosyalarìnì hemen her dilde
- kolaylìkla dinlenebilmesi için yazìlmìƒ.
-
- ┌──────────────────────────────────────────────────────────────┐
- │ HSC-Tracker V1.2 │
- │ │
- │ (C)1993 by Zwerg Zwack and Chicken │
- │ Soundroutine (C) 1992/93 by NEO Software Produktions GmbH │
- │ Home of HSC-Tracker: The Lycaeum +41 41-762-989 (v32b,v42b) │
- │ │
- │ Registered to you! │
- └──────────────────────────────────────────────────────────────┘
-
- Döküman dosyasìnda bu ƒekilde bir giriƒ yapan bu mütevazi
- insanlarìn yaptìklarì sürücü gerçekten tam bir harika. Programlarìnìn
- bedava olduºunu ve bedava olmak koƒuluyla diºer programlarda da kullanìlmasì
- için izin verdiklerini belirten bu kiƒileri yürekten kutlarìm.
-
- Sürücünün herhangi bir bellek alanìna sìfìrìncì offsetinden
- baƒlamak üzere atìlmasì ve sonra da dinlenmek istenen dosyanìn okutulup
- verilerin segment ve offset adreslerinin bu sürücüye bildirilmesi gerekiyor.
-
- Basic programcìlarì için oldukca karmaƒìk sayìlacak bu yapì
- için sizlere program gönderiyorum. Bu programlar hakkìnda kìsaca bilgiler:
-
- ┌─────────────────────────────────┐
- │ Hscdinle.Asm isimli kaynak kod │
- └─────────────────────────────────┘
-
- Bu hscplayer ile birlikte gerekli bir kaç yordamì içeriyor.
- Basic programcìlarì kullanmak için;
-
- Versiyon 7.1 'de
-
- DEL HSCDINLE.LIB
- TASM HSCDINLE/m
- LIB QBX *INTRPT
- LIB HSCDINLE +INTRPT+HSCDINLE,;
- LINK/Q HSCDINLE.LIB,HSCDINLE.QLB,,QBXQLB;
- QBX/L HSCDINLE
-
- Versiyon 4.5 'de
-
- DEL HSCDINLE.LIB
- TASM HSCDINLE/m
- LIB QB *INTRPT
- LIB HSCDINLE +INTRPT+HSCDINLE,;
- LINK/Q HSCDINLE.LIB,HSCDINLE.QLB,,BQLB45;
- QB/L HSCDINLE
-
- ƒeklinde bir batch dosya çalìƒtìrmalarì gerekiyor.
-
- ┌─────────────────────────────────┐
- │ Hscdinle.Bas isimli kaynak kod │
- └─────────────────────────────────┘
-
- Bu kaynak kod sadece versiyon 7.1'de çalìƒmak üzere tasarlandì.
- Gerekce ise gayet basit çünkü bu versiyonda "ON LOCAL ERROR", "CURDIR$" gibi
- geliƒmiƒ komutlar var.
-
- Bu programìn ayrìca .exe'si de verildi. Porgram vasìtasìyla
- hsc müzik dinleyebilir, bu dinlemeyi tsr olarak yapabilirsiniz. Oldukça
- beºeni alan bir program olduºunu belirtmeliyim.
-
- ┌───────────────────────────────┐
- │ Hscbas.Bas isimli kaynak kod │
- └───────────────────────────────┘
-
- Bu program ise her iki versiyonda yani versiyon 4.5'da dahil
- olmak üzere hsc müzik dinlemeye bir örnek olarak hazìrlandì.
-
- Unutulmamasì gereken bir nokta her iki program için basice
- "QBX /L HSCDINLE" veya "QB /L HSCDINLE" ƒeklinde baƒlamak gerekiyor.
-
- ┌────────────────────────────────┐
- │ Odam.Hsc isimli müzik dosyasì │
- └────────────────────────────────┘
-
- Sevgili M.Doºan ÖZDEMÿR tarafìndan yapìlmìƒ, .hsc formatìnda
- güzel ve türkçe bir melodi. Daha baƒka .hsc müzikler için kendisine internet
- üzerinden "Dogano@Doruk.com.tr" adresi yoluyla ulaƒabilirsiniz.
-
- Görüƒmek üzere...
-
- Adres:
- PC World/Türkiye
- PS-Gürol Demir
- Eski Büyükdere cad.
- Sanayi mah. Behçet sokak
- No:25/B Kat:5
- 80650 4.Levent / ÿSTANBUL
- Internet : gurold@doruk.com.tr
-
-